/**
 * HTTP 请求工具
 * 统一处理 API 请求、响应拦截、错误处理
 */

import config from '@/config'

// API 基础路径
const BASE_URL = config.API_BASE_URL

const hasHeader = (headers = {}, key = '') => {
  const target = key.toLowerCase()
  return Object.keys(headers).some((headerKey) => headerKey.toLowerCase() === target)
}

/**
 * 通用请求方法
 * @param {string} url - 请求路径
 * @param {object} options - 请求配置
 * @returns {Promise} 响应数据
 */
async function request(url, options = {}) {
  const token = localStorage.getItem('token')
  const isFormData = options.body instanceof FormData

  const mergedHeaders = {
    ...(token ? { Authorization: `Bearer ${token}` } : {}),
    ...(options.headers || {})
  }

  if (!isFormData && !hasHeader(mergedHeaders, 'content-type') && options.method !== 'GET') {
    mergedHeaders['Content-Type'] = 'application/json'
  }

  const finalOptions = {
    ...options,
    headers: mergedHeaders
  }

  try {
    const response = await fetch(`${BASE_URL}${url}`, finalOptions)
    
    // 处理 HTTP 错误状态
    if (!response.ok) {
      if (response.status === 401) {
        // 未授权：仅当之前已有 token 时才触发登出与跳转，避免未登录时无限刷新
        if (token) {
          localStorage.removeItem('token')
          if (window.location.pathname !== '/user-login') {
            window.location.href = '/user-login'
          }
        }
        const error = new Error('未授权，请重新登录')
        error.code = response.status
        throw error
      }
      const error = new Error(`HTTP ${response.status}: ${response.statusText}`)
      error.code = response.status
      throw error
    }

    const data = await response.json()
    
    // 处理业务错误（后端返回格式为 { code: number, message: string, data: any }）
    // code 为 200 或 0 表示成功
    if (data.code && data.code !== 200 && data.code !== 0) {
      const error = new Error(data.message || '请求失败')
      error.code = data.code
      error.response = data
      throw error
    }

    return data
  } catch (error) {
    console.error('请求错误:', error)
    throw error
  }
}

/**
 * GET 请求
 * @param {string} url - 请求路径
 * @param {object} params - 查询参数
 * @returns {Promise} 响应数据
 */
export function get(url, params = {}) {
  const queryString = new URLSearchParams(params).toString()
  const fullUrl = queryString ? `${url}?${queryString}` : url
  
  return request(fullUrl, {
    method: 'GET'
  })
}

/**
 * POST 请求
 * @param {string} url - 请求路径
 * @param {object|FormData} data - 请求体数据
 * @param {object} extraOptions - 额外配置（可选）
 * @returns {Promise} 响应数据
 */
export function post(url, data = {}, extraOptions = {}) {
  const hasCustomBody = extraOptions.body !== undefined
  const body = hasCustomBody
    ? extraOptions.body
    : data instanceof FormData
      ? data
      : JSON.stringify(data)

  return request(url, {
    method: 'POST',
    ...extraOptions,
    body
  })
}

/**
 * PUT 请求
 * @param {string} url - 请求路径
 * @param {object|FormData} data - 请求体数据
 * @param {object} extraOptions - 额外配置（可选）
 * @returns {Promise} 响应数据
 */
export function put(url, data = {}, extraOptions = {}) {
  const hasCustomBody = extraOptions.body !== undefined
  const body = hasCustomBody
    ? extraOptions.body
    : data instanceof FormData
      ? data
      : JSON.stringify(data)

  return request(url, {
    method: 'PUT',
    ...extraOptions,
    body
  })
}

/**
 * DELETE 请求
 * @param {string} url - 请求路径
 * @returns {Promise} 响应数据
 */
export function del(url) {
  return request(url, {
    method: 'DELETE'
  })
}

export default {
  get,
  post,
  put,
  delete: del
}

